package Negocios;

import CDB.Detalleventa;
import CDB.Empleados;
import CDB.PersonFactory;
import CDB.Ventas;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

/**
 *
 * @author ISC Erick
 */
public class ControlSales {

    private Session sessions;
    private Transaction transaction;
    private SessionFactory sessionFactory = null;

    public ControlSales() {
    }

    public List selectAll() {
        List list = null;
        try {
            Session session = createSession();
            //Creacion de query para obtener todos los empleados
            list = session.createQuery("from Ventas s").list();
            session.close();
            //Retorno la lista con todos los empleados
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return list;
    }

    public List selectAllByEmployee(Long id) {
        List list = null;
        try {
            Session session = createSession();
            //Creacion de query para obtener todos los detallesProducto con un id de producto especifico
            list = session.createQuery("from Sales s where s.idempleado.id=" + id).list();
            session.close();
            //Retorno la lista con todos los detallesProducto
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return list;
    }

    public List selectAllBySaleEmployee(long sale, long employee) {
        try {
            Session session = createSession();
            List sales;
            Query salesQ = session.createQuery("from Sales s where s.id=" + sale + " and s.idempleado.id=" + employee);
            sales = (List) salesQ.list();
            session.close();
            return sales;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            return null;
        }
    }

    public Ventas selectOne(int id) {
        Ventas venta = null;
        try {
            Session sesion = createSession();
            venta = (Ventas) sesion.load(Ventas.class,
                    new Integer(id));
            sesion.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return venta;
    }

    public Ventas getLast() {
        Ventas venta;
        Session session = createSession();
        try {
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            String consulta = "from Ventas order by idventa desc";
            venta = (Ventas) session.createQuery(consulta).setMaxResults(1).list().get(0);
            return venta;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            return null;
        } finally {
            session.flush();
            session.close();
        }
    }

    public void add(Date fecha, Empleados empleado, int venta) {
        try {
            iniciaSF();
            Ventas sale = new Ventas();

            //construir venta apartir de los datos proporcionados
            sale.setFecha(fecha);
            sale.setEmpleados(empleado);
            sale.setTotalventa(venta);
            //Guardar la venta mandada
            sessions.save(sale);

            //Si no a ocurrido un error 
            cierraSF();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }

    }

    public void update(int idVenta, Date fecha, Empleados empleado, int venta) {
        try {
            iniciaSF();

            Ventas sale = (Ventas) sessions.load(Ventas.class,
                    new Integer(idVenta));

            //construir la venta apartir de los datos proporcionados
            sale.setFecha(fecha);
            sale.setEmpleados(empleado);
            sale.setTotalventa(venta);
            //Operacion hibernate para borrar un registro
            sessions.update(sale);

        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            cierraSF();
        }
    }

    public void delete(int id) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();

            //Operacion hibernate para borrar un registro
            Ventas sale = new Ventas();
            sale.setIdventa(id);
            session.delete(sale);

            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
    }

    public void delete(Ventas venta) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            session.delete(venta);
            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
    }
    
    public void delete(Detalleventa detalle) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            session.delete(detalle.getVentas());
            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
    }

    public void deletaAll() {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();

            //Operacion hibernate para borrar todos los registros de la tabla
            session.delete("from Ventas v");

            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
    }

    public Session createSession() {

        Session session = null;
        try {
            //creando la nueva session para usar hibernate
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();

        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de ventas.", "Error al crear Session",
                    0);
            session.close();
        }
        return session;
    }

    public void iniciaSF() {
        try {
            sessions = null;
            sessionFactory = PersonFactory.getSessionFactory();
            sessions = sessionFactory.openSession();
            transaction = sessions.beginTransaction();
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de producto.", "Error al iniciar Session",
                    0);
        }

    }

    public void cierraSF() {
        try {
            transaction.commit();
            sessions.flush();
            sessions.close();
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de producto.", "Error al cerrar Session",
                    0);
        }
    }
}
